#include <stdio.h>
#include "LTE_ConvEncode.h"

#define K 6 // reg_num
//#define IN_LENGTH 24

// 鐢熸垚澶氶」寮�
int polygen_1[K] = {0, 1, 1, 0, 1, 1}; // 133
int polygen_2[K] = {1, 1, 1, 0, 0, 1}; // 171
int polygen_3[K] = {1, 1, 0, 1, 0, 1}; // 165
// reg state
int reg_states[K];

void LTE_ConvEncode(hs_uint8_t *input_bits, hs_uint8_t *output_bits, int IN_LENGTH)
{
    int i, j, t, m, val_1, val_2, val_3;
    for (t = 0; t < K; t++)
    {
        reg_states[t] = input_bits[IN_LENGTH - 1 - t];
    }
    for (i = 0; i < IN_LENGTH; i++)
    {
        // init temp vals
        val_1 = input_bits[i];
        val_2 = input_bits[i];
        val_3 = input_bits[i];
        // calc conv codes
        for (j = 0; j < K; j++)
        {
            val_1 += polygen_1[j] * reg_states[j];
            val_2 += polygen_2[j] * reg_states[j];
            val_3 += polygen_3[j] * reg_states[j];
        }
        // output conv codes
        output_bits[i * 3] = val_1 % 2;
        output_bits[i * 3 + 1] = val_2 % 2;
        output_bits[i * 3 + 2] = val_3 % 2;
        // update regs
        for (m = K - 1; m > 0; m--)
        {
            reg_states[m] = reg_states[m - 1];
        }
        reg_states[0] = input_bits[i];
    }
}

//void print_file(int IN_LENGTH)
//{
//    int input_bits[IN_LENGTH];
//    int output_bits[IN_LENGTH * 3];
//    int i, j, input_data;
//    // input hex data
//    input_data = 0x56ca87;
//    for (i = 0; i < IN_LENGTH; i++)
//    {
//        input_bits[IN_LENGTH - 1 - i] = input_data & 1;
//        input_data >>= 1;
//        // printf(" %d ",input_bits[IN_LENGTH - 1 - i]);
//    }
//
//    LTE_ConvEncode(input_bits, output_bits,IN_LENGTH);
//
//    // output result to file
//    FILE *fp = fopen("./data.txt", "w");
//    if ((fp == NULL))
//    {
//        printf("\nerror on open ");
//    }
//    for (j = 0; j < IN_LENGTH * 3; j++)
//    {
//        fprintf(fp, "%d\n", output_bits[j]);
//    }
//
//    fclose(fp);
//
////    return 0;
//}
